package rhplus.utilizador;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;
import rhplus.persistencia.ContaDeUtilizador;

@PersistenceCapable
public class MembroDoAgregado implements Serializable{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_pessoa;

    @Persistent
    private Long id_titular; // igual AO IDpessoa que tem conta

    /** Creates a new instance of MembroDoAgregado */
    public MembroDoAgregado(final Long id_titular, final Long id_pess) {

        this.id_titular=id_titular;
   this.id_pessoa = id_pess;
        
    }

    public Long getIdTitular(){
        return id_titular;
    }

    public Long getIdPessoa(){
        return id_pessoa;
    }

    public void setIdTitular(long idTitular){
        this.id_titular=idTitular;
    }

    //Devolve membro do agregado pelo seu username, se for maior de idade
    public static Pessoa devolve(final String username) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where username == '" + username + "'";

        Long id_pessoa = (((List<Pessoa>) pm.newQuery(query).execute()).get(0)).getIdPessoa();

        query = "select from " + MembroDoAgregado.class.getName()
                + " where id_pessoa == " + id_pessoa;
        
        return ((List<Pessoa>) pm.newQuery(query).execute()).get(0);

    }

    //Devolve membro de agregado pelo seu id, se for menor de idade
    public static Pessoa devolve(final Long id_pessoa) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Pessoa.class.getName()
                + " where id_pessoa == " + id_pessoa;
        
        return ((List<Pessoa>) pm.newQuery(query).execute()).get(0);
    }

    public static LinkedList<Pessoa> devolveTodosDoCliente(final Long id_titular)  throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + MembroDoAgregado.class.getName()
                + " where id_titular == " + id_titular;

        List<MembroDoAgregado> lista = (List<MembroDoAgregado>) pm.newQuery(query).execute();

        LinkedList<Pessoa> lista_de_ma = new LinkedList<Pessoa>();

        for(MembroDoAgregado m : lista){
            lista_de_ma.add(Pessoa.devolve(m.getIdPessoa()));
        }
        return lista_de_ma;
    }

   public static void insere(MembroDoAgregado novo_membro_do_agregado)  {

       // Insere a parte de utente do membro do agregado (Pessoa)


        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(novo_membro_do_agregado);
        } finally {
            pm.close();
        }
    }

    public static void remove(final Long id_pessoa)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
		pm.currentTransaction().begin();

		MembroDoAgregado membro  = pm.getObjectById(MembroDoAgregado.class, id_pessoa);
		pm.deletePersistent(membro);

		pm.currentTransaction().commit();
	} catch (Exception ex) {
		pm.currentTransaction().rollback();
		throw new RuntimeException(ex);
	} finally {
		pm.close();
	}
    }

    public void removeTratamentoPassado(Long id_tratamento_passado) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        TratamentoPassado.remove(id_tratamento_passado);
    }

    public void alteraTratamentoPassado(TratamentoPassado dados_do_tratamento_passado) throws Exception{
        TratamentoPassado.altera(dados_do_tratamento_passado);
    }

    public void adicionaTratamentoPassado(TratamentoPassado dados_do_tratamento_passado) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        TratamentoPassado.insere(dados_do_tratamento_passado);
    }

    public void removeDoencaPassada(int id_doenca_passada) {
        throw new UnsupportedOperationException("Not yet implemented");
    }


   

    @Override
    public String toString() {
        return "id_titular " + id_titular + " idpessoa " + id_pessoa;
    }


}
